package peace.util
{
	import flash.utils.ByteArray;
	
	
public class Arrays
{
	/**
	 * 
	 * @param o
	 * @param arr
	 * @return 
	 * 
	 */	
	public static function has (o:*, arr:Array):Boolean
	{
		return arr.indexOf(o) > -1;
	}
	/**
	 * Удаляем элемент массива с проверкой наличия
	 * 
	 * @param item
	 * @param array
	 * @return 
	 * 
	 */
	public static function removeItem (item:*, array:Array):*
	{
		var index:int = array.indexOf(item);
		if (index > -1)
		{
			array.splice(index, 1);
		}
		return item;
	}
	/**
	 * 
	 * @param arr1
	 * @param arr2
	 * @return 
	 * 
	 */	
	public static function equals(arr1 : Array, arr2 : Array) : Boolean 
	{
		if (arr1 == arr2) return true;
		
		if (arr1.length != arr2.length)	return false;
		
		for (var i : uint = 0; i < arr1.length; i++) 
		{
			if (arr1[i] != arr2[i])	return false;
		}
		
		return true;
	}
	/**
	 * 
	 * @param index1
	 * @param index2
	 * @param array
	 * 
	 */	
	public static function swap (index1:uint, index2:uint, array:Array):void
	{
		var tmp:* = array[index1];
		array[index1] = array[index2];
		array[index2] = tmp;
	}
	
	/**
	 * Конвертим массив в хеш по значению ключевого поля 
	 * @param arr
	 * @param indexProperty
	 * @return 
	 */		
	public static function toHash (arr:Array, indexProperty:String):Object
	{
		var ret:Object = {};
		for each (var i:* in arr)
		{
			ret[i[indexProperty]+""] = i;
		}
		return ret;
	}
	/**
	 * Конвертим хеш в массив 
	 * @param hash
	 * @return 
	 */		
	public static function fromHash (hash:Object):Array
	{
		var arr:Array = [];
		for each (var s:* in hash)
		{
			arr.push(s);
		}
		return arr;
	}
	/**
	 * Поиск индекса элемента массива по значению свойства propName
	 * 
	 * @param array
	 * @param propName
	 * @param propValue
	 * @return 
	 * 
	 */
	public static function indexOfByProperty (array:Array, propName:String, propValue:*):int
	{
		var i:int;
		for (i = 0; i < array.length; i++)
		{
			if (array[i].hasOwnProperty(propName) && array[i][propName] == propValue) return i;
		}
		return -1;
	}
	/**
	 * 
	 * @param arr
	 * @param cl
	 * @param fromIndex
	 * @return 
	 * 
	 */	
	public static function findClassInstance (arr:Array, cl:Class, fromIndex:uint=0):Object
	{
		for (var i:uint = fromIndex; i < arr.length; i++)
		{
			if (arr[i] is cl)
			{
				return arr[i];
			}
		}
		return null;
	}
	/**
	 * Пустой ли массив
	 * 
	 * @param arr
	 * @return 
	 * 
	 */	
	public static function isEmpty (arr:Array):Boolean
	{
		if (arr.length == 0) return true;	
		
		var ba:ByteArray = new ByteArray();
		ba.writeObject(arr);
		if (ba.length == 3) return true;
		
		for each (var i:* in arr)
		{
			if (i) return false;
		}
		return true;
	}

}
}


